版本


只要继承了 APIView 就可以使用版本

1. 版本的作用

  • 根据版本的不同返回相应的数据结构

  • 限制只能使用哪几个版本的接口

2. 局部版本

  • 局部版本的配置(即: versioning_class = 版本类)会覆盖掉该视图类在全局版本中的配置

  • versioning_class = 版本类

  • QueryParameterVersioning 版本类 -> 从 url 参数中获取版本号

    • url版本参数的默认参数名: version


# views.py

from rest_framework.views import APIView
from rest_framework.response import Response

from rest_framework.versioning import QueryParameterVersioning, URLPathVersioning


class BookViewSet(APIView):

versioning_class = QueryParameterVersioning  # 局部版本

    def get(self, request, *args, **kwargs):

        print(request.version)  # v1 -> 获取当前版本号
        print(request.versioning_scheme)  # QueryParameterVersioning 的实例化对象

        if request.version == 'v1':
            return Response('v1版本的数据')
        else:
            return Response('其他版本的数据')

  • URLPathVersioning 版本类 -> 使用url正则匹配获取版本号 -> 推荐使用

    • 命名匹配的默认名称: version


# views.py

from rest_framework.views import APIView
from rest_framework.response import Response

from rest_framework.versioning import QueryParameterVersioning, URLPathVersioning


class BookViewSet(APIView):

versioning_class = URLPathVersioning  # 局部版本

    def get(self, request, *args, **kwargs):

        print(request.version)  # v1 -> 获取当前版本号
        print(request.versioning_scheme)  # QueryParameterVersioning 的实例化对象

        if request.version == 'v1':
            return Response('v1版本的数据')
        else:
            return Response('其他版本的数据')

    • 注意: url必须使用命名匹配

# urls.py

urlpatterns = [
# url(r'api/(?P<version>[v1|v2]+)/book', BookViewSet.as_view()),
# 等同于
    url(r'api/(?P<version>\w+)/book', BookViewSet.as_view()),  # 使用该正则的前提必须设置了允许的版本
]

  • request.version 和 request.versioning_scheme 的说明

    • 如果使用了版本,那么 request 就会被绑定两个属性: version 和 versioning_scheme 

      • version: 当前版本,用于根据版本的不同返回相应的数据结构
      • versioning_scheme: 当前使用的版本类的实例化对象

# views.py

from rest_framework.views import APIView
from rest_framework.response import Response

from rest_framework.versioning import QueryParameterVersioning, URLPathVersioning


class BookViewSet(APIView):

    versioning_class = URLPathVersioning  

    def get(self, request, *args, **kwargs):

        print(request.version)  # v1 -> 获取当前版本号
        print(request.versioning_scheme)  # QueryParameterVersioning 的实例化对象

        if request.version == 'v1':
            return Response('v1版本的数据')
        else:
            return Response('其他版本的数据')

  • version 参数名的修改

    • version 参数名必须要在全局设置中修改(即: settings.py)

    • QueryParameterVersioning 的 url版本参数名 “version” 和 URLPathVersioning 命名匹配的 “version”,使用的都是同一个配置项中的参数名

# settings.py

REST_FRAMEWORK = {
    "VERSION_PARAM": 'v',  # 参数名
}

  • 默认版本号

    • 该设置必须在全局中进行设置(即: settings.py)

# settings.py

REST_FRAMEWORK = {
    "VERSION_PARAM": 'version',  # 参数名

    'DEFAULT_VERSION': 'v1',  # 默认版本号
}

  • 允许的版本

    • 说明: 允许调用当前接口的哪些版本

    • 该设置必须在全局中进行设置(即: settings.py)

# settings.py

REST_FRAMEWORK = {
    "VERSION_PARAM": 'version',  # 参数名
    'DEFAULT_VERSION': 'v1',  # 默认版本号

    'ALLOWED_VERSIONS': ['v1', 'v2'],  # 允许的版本
}

2. 全局版本

  • 全局版本作用于所有视图类

  • 可以通过设置局部版本来覆盖全局版本的设置

# settings.py

REST_FRAMEWORK = {
……
    "DEFAULT_VERSIONING_CLASS": "rest_framework.versioning.URLPathVersioning",  # 使用什么版本类
    "VERSION_PARAM": 'version',  # 参数名
    'DEFAULT_VERSION': 'v1',  # 默认版本号
    'ALLOWED_VERSIONS': ['v1', 'v2'],  # 允许的版本
}